﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.OracleClient;
using System.Data;
using System.Configuration;

namespace Datos
{
    //Clase Usuario Acceso Datos
    public class UsuarioAD
    {
        //trae usuarios pal combobox de presupuesto
        public static List<Usuario> GetAll()
        {
            string sql = @"SELECT rutusuario, 
                                  id_tipousuario,
                                  nombre,
                                  apellido,
                                  direccion,
                                  telefono,
                                  mail,
                                  contrasena,
                                  estado
                             FROM usuario
                            WHERE estado='Activo'";

            List<Usuario> list = new List<Usuario>();

            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {

                OracleCommand command = new OracleCommand(sql, conn);

                conn.Open();

                OracleDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    list.Add(LoadUsuario(reader));
                }

                return list;
            }

        }

        //restablecer contraseña
        public static int RestablecerContraseña(string rut)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {



                string sqlUpdate = "update usuario ";
                sqlUpdate += "set contrasena = :p_contrasena ";
                sqlUpdate += "where rutusuario = :p_rutusuario";

                OracleCommand cmdUpdate = new OracleCommand();
                cmdUpdate.CommandText = sqlUpdate;
                cmdUpdate.Connection = oraConn;

                OracleParameter pContraseña = new OracleParameter();
                string password = Helper.EncodePassword(string.Concat(rut, "123456"));
                pContraseña.Value = password;
                pContraseña.ParameterName = "p_contrasena";

                OracleParameter pRutUsuario = new OracleParameter();
                pRutUsuario.Value = rut;
                pRutUsuario.ParameterName = "p_rutusuario";





                cmdUpdate.Parameters.Add(pContraseña);
                cmdUpdate.Parameters.Add(pRutUsuario);




                k = cmdUpdate.ExecuteNonQuery();

                cmdUpdate.Dispose();
                oraConn.Close();

                return k;
            }
            return k;

        }

        //carga usuarios
        public static Usuario LoadUsuario(IDataReader reader ) 
        {
            Usuario usuario = new Usuario();
            TipoUsuario tipousuario = new TipoUsuario();

            usuario.RutUsuario = Convert.ToString(reader["rutusuario"]);
            usuario.tipousuario = TipoUsuarioAD.GetTipoUsuarioById(Convert.ToInt32(reader["id_tipousuario"]));
            usuario.nombre = Convert.ToString(reader["nombre"]);
            usuario.apellido = Convert.ToString(reader["apellido"]);
            usuario.direccion = Convert.ToString(reader["direccion"]);
            usuario.telefono = Convert.ToInt32(reader["telefono"]);
            usuario.mail= Convert.ToString(reader["mail"]);
            usuario.contraseña = Convert.ToString(reader["contrasena"]);
            usuario.estado = Convert.ToString(reader["estado"]);
            


            return usuario;
        }

        //traer usuario por rut
        public static Usuario GetByRut(string Rut)
        {
            string sql = @"select	 RUTUSUARIO,
                                     ID_TIPOUSUARIO,
	                                 NOMBRE,
	                                 APELLIDO,
	                                 DIRECCION,
	                                 TELEFONO,
	                                 MAIL,
	                                 CONTRASENA,
	                                 ESTADO
	                        from   	 USUARIO 
	                        where    RUTUSUARIO = "+Rut ;
 

            Usuario usuario = null;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                usuario = LoadUsuario(reader);
            }

            return usuario;

        }
  
        //modificar usuario
        public static int ModificarUsuario(Usuario usuario)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {



                string sqlUpdate = "update usuario ";
                sqlUpdate += "set id_tipousuario = :p_idtipousuario, ";
                sqlUpdate += "nombre = :p_nombre, ";
                sqlUpdate += "apellido = :p_apellido, ";
                sqlUpdate += "direccion = :p_direccion, ";
                sqlUpdate += "telefono = :p_telefono, ";
                sqlUpdate += "mail = :p_mail ";
                sqlUpdate += "where rutusuario = :p_rutusuario";

                OracleCommand cmdUpdate = new OracleCommand();
                cmdUpdate.CommandText = sqlUpdate;
                cmdUpdate.Connection = oraConn;



                OracleParameter pIdTipoUsuario = new OracleParameter();
                pIdTipoUsuario.OracleType = OracleType.Int32;
                if (usuario.tipousuario.ID_TipoUsuario != 0)
                {

                    pIdTipoUsuario.Value = Convert.ToInt32(usuario.tipousuario.ID_TipoUsuario);
                }
                else
                {
                    pIdTipoUsuario.Value = 1;
                }
                pIdTipoUsuario.ParameterName = "p_idtipousuario";

                OracleParameter pNombre = new OracleParameter();
                pNombre.Value = usuario.nombre;
                pNombre.ParameterName = "p_nombre";

                OracleParameter pApellido = new OracleParameter();
                pApellido.Value = usuario.apellido;
                pApellido.ParameterName = "p_apellido";

                OracleParameter pDireccion = new OracleParameter();
                pDireccion.Value = usuario.direccion;
                pDireccion.ParameterName = "p_direccion";


                OracleParameter pTelefono = new OracleParameter();
                pTelefono.OracleType = OracleType.Int32;
                pTelefono.Value = usuario.telefono;
                pTelefono.ParameterName = "p_telefono";

                OracleParameter pMail = new OracleParameter();
                pMail.Value = usuario.mail;
                pMail.ParameterName = "p_mail";

                OracleParameter pRutUsuario = new OracleParameter();
                pRutUsuario.Value = usuario.RutUsuario;
                pRutUsuario.ParameterName = "p_rutusuario";

                cmdUpdate.Parameters.Add(pIdTipoUsuario);
                cmdUpdate.Parameters.Add(pNombre);
                cmdUpdate.Parameters.Add(pApellido);
                cmdUpdate.Parameters.Add(pDireccion);
                cmdUpdate.Parameters.Add(pTelefono);
                cmdUpdate.Parameters.Add(pMail);
                cmdUpdate.Parameters.Add(pRutUsuario);

               

                    k = cmdUpdate.ExecuteNonQuery();
                
                 
                cmdUpdate.Dispose();
                oraConn.Close();
                return k;
            }
            return k;


        }


        //inserta nuevo usuario
        public static int NuevoUsuario(Usuario usuario)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {
                string sqlInsert = "insert into usuario (RUTUSUARIO,ID_TIPOUSUARIO,NOMBRE,APELLIDO,DIRECCION,TELEFONO,MAIL,CONTRASENA,ESTADO) ";
                sqlInsert += "values (:p_rutusuario, :p_id_tipousuario, :p_nombre, :p_apellido, :p_direccion, :P_telefono, :p_mail, :p_contraseña, :p_estado)";

                OracleCommand cmdInsert = new OracleCommand();
                cmdInsert.CommandText = sqlInsert;
                cmdInsert.Connection = oraConn;

                OracleParameter pRutUsuario = new OracleParameter();
                pRutUsuario.Value = usuario.RutUsuario;
                pRutUsuario.ParameterName = "p_rutusuario";

                OracleParameter pTipoUsuario = new OracleParameter();
                pTipoUsuario.DbType = DbType.Int32;
                pTipoUsuario.Value = Convert.ToInt32(usuario.tipousuario.ID_TipoUsuario);
                pTipoUsuario.ParameterName = "p_id_tipousuario";

                OracleParameter pNombre = new OracleParameter();
                pNombre.Value = usuario.nombre;
                pNombre.ParameterName = "p_nombre";

                OracleParameter pApellido = new OracleParameter();
                pApellido.Value = usuario.apellido;
                pApellido.ParameterName = "p_apellido";

                OracleParameter pDireccion = new OracleParameter();
                pDireccion.Value = usuario.direccion;
                pDireccion.ParameterName = "p_direccion";

                OracleParameter pTelefono = new OracleParameter();
                pTelefono.Value = usuario.telefono;
                pTelefono.ParameterName = "p_telefono";

                OracleParameter pMail = new OracleParameter();
                pMail.Value = usuario.mail;
                pMail.ParameterName = "p_mail";

                OracleParameter pContraseña = new OracleParameter();
                string password = Helper.EncodePassword(string.Concat(usuario.RutUsuario, usuario.contraseña));
                pContraseña.Value = password;
                pContraseña.ParameterName = "p_contraseña";

                OracleParameter pEstado = new OracleParameter();
                pEstado.Value = usuario.estado;
                pEstado.ParameterName = "p_estado";

              


                cmdInsert.Parameters.Add(pRutUsuario);
                cmdInsert.Parameters.Add(pTipoUsuario);
                cmdInsert.Parameters.Add(pNombre);
                cmdInsert.Parameters.Add(pApellido);
                cmdInsert.Parameters.Add(pDireccion);
                cmdInsert.Parameters.Add(pTelefono);
                cmdInsert.Parameters.Add(pMail);
                cmdInsert.Parameters.Add(pContraseña);
                cmdInsert.Parameters.Add(pEstado);
               

                k = cmdInsert.ExecuteNonQuery();

                cmdInsert.Dispose();







            } return k;
        }

        //modificar usuario estado para bloquearlo
       public static int BloqueaUsuario(Usuario usuario)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {



                string sqlUpdate = "update usuario ";
                sqlUpdate += "set estado = :p_estado ";
                sqlUpdate += "where rutusuario = :p_rutusuario";

                OracleCommand cmdUpdate = new OracleCommand();
                cmdUpdate.CommandText = sqlUpdate;
                cmdUpdate.Connection = oraConn;

                OracleParameter pEstado = new OracleParameter();
                pEstado.Value = usuario.estado;
                pEstado.ParameterName = "p_estado";
     
                OracleParameter pRutUsuario = new OracleParameter();
                pRutUsuario.Value = usuario.RutUsuario;
                pRutUsuario.ParameterName = "p_rutusuario";

              


               
                cmdUpdate.Parameters.Add(pEstado);
                cmdUpdate.Parameters.Add(pRutUsuario);


              
                
                k = cmdUpdate.ExecuteNonQuery();

                cmdUpdate.Dispose();

                return k;
            }
            return k;

        }

        //cambiar contraseña
       public static int CambiarContraseña(string rut, string pass)
       {
           OracleConnection oraConn = new OracleConnection();
           int k = 0;
           string connString = "Server=XE;Uid=juan;Pwd=lagartija";
           if (oraConn.State != ConnectionState.Open)
           {
               try
               {
                   oraConn.ConnectionString = connString;

                   oraConn.Open();

                   Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
               }
               catch (Exception ex)
               {
                   Console.WriteLine(ex.Message, "Exception Caught");
               }
           }

           if (oraConn.State == ConnectionState.Open)
           {



               string sqlUpdate = "update usuario ";
               sqlUpdate += "set contrasena = :p_contrasena ";
               sqlUpdate += "where rutusuario = :p_rutusuario";

               OracleCommand cmdUpdate = new OracleCommand();
               cmdUpdate.CommandText = sqlUpdate;
               cmdUpdate.Connection = oraConn;

               OracleParameter pContraseña = new OracleParameter();
               string password = Helper.EncodePassword(string.Concat(rut, pass));
               pContraseña.Value = password;
               pContraseña.ParameterName = "p_contrasena";

               OracleParameter pRutUsuario = new OracleParameter();
               pRutUsuario.Value = rut;
               pRutUsuario.ParameterName = "p_rutusuario";





               cmdUpdate.Parameters.Add(pContraseña);
               cmdUpdate.Parameters.Add(pRutUsuario);




               k = cmdUpdate.ExecuteNonQuery();

               cmdUpdate.Dispose();
               oraConn.Close();

               return k;
           }
           return k;

       }


        //traer Todos los dentistas
       public static List<Usuario> GetAllDentistas()
       {
           string sql = @"SELECT rutusuario, 
                                  id_tipousuario,
                                  nombre,
                                  apellido,
                                  direccion,
                                  telefono,
                                  mail,
                                  contrasena,
                                  estado
                             FROM usuario
                            WHERE estado='Activo'
                              AND id_tipousuario = 2";

           List<Usuario> list = new List<Usuario>();
           
           using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
           {
               try
               {
                   OracleCommand command = new OracleCommand(sql, conn);

                   conn.Open();

                   OracleDataReader reader = command.ExecuteReader();

                   while (reader.Read())
                   {
                       list.Add(LoadUsuario(reader));
                   }
                   conn.Close();
               }
               catch (Exception e)
               {

               }
               return list;
           }

       }

     }//fin clase UsuarioAD


    //clase Tipo Usuario Acceso Datos
    public class TipoUsuarioAD
    {
        //tipos de usuarios para combobox
        public static List<TipoUsuario> GetAll()
        {
            string sql = @"SELECT id_tipousuario, 
                                  nombretipousuario 
                           FROM tipo_usuario";

            List<TipoUsuario> list = new List<TipoUsuario>();

            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {

                OracleCommand command = new OracleCommand(sql, conn);

                conn.Open();

                OracleDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    list.Add(LoadTipoUsuario(reader));
                }

                return list;
            }

        }

        //trae tipo de usuaro por id
        public static TipoUsuario GetTipoUsuarioById(int id_tipousuario)
        {
            string sql = @"SELECT id_tipousuario, 
                                  nombretipousuario
                           FROM tipo_usuario
                           WHERE id_tipousuario = "+id_tipousuario;

            TipoUsuario tipousuario = null;

            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {

                OracleCommand command = new OracleCommand(sql, conn);
               

                conn.Open();

                OracleDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    tipousuario = LoadTipoUsuario(reader);
                }
                conn.Close();
                return tipousuario;
              
            }

        }

        //carga tipos de usuarios
        public static TipoUsuario LoadTipoUsuario(IDataReader reader)
        {
            TipoUsuario tipousuario = new TipoUsuario();

            tipousuario.ID_TipoUsuario = Convert.ToInt32(reader["id_tipousuario"]);
            tipousuario.NombreTipoUsuario = Convert.ToString(reader["nombretipousuario"]);

            return tipousuario;
        }

       
    }


}
